/**
 * Fichier ServiceTableModel.java : Définition de classe
 * fr.unice.gnpt.gui.util.ServiceTableModel : ###Description###
 * 
 * Auteurs : Groupe GNPT : Gastinel, Nicolas, Pellegrino, Trovato
 */
package fr.unice.gnpt.gui.util;

import java.util.ArrayList;
import java.util.Collection;

import javax.swing.table.AbstractTableModel;

import fr.unice.gnpt.Main;

/**
 * Classe abstraite de gestion du contenu des JTable.
 * 
 * @author gnpt
 * @version 0.0.2
 * @param <T>
 */
public abstract class ServiceTableModel<T> extends AbstractTableModel {

	private static final long serialVersionUID = 1L;
	// Données du Modèle
	private ArrayList<T> donnees;
	// Nom et classes des colonnes du modèle
	/**
	 * 
	 */
	protected String[] nomColonnes = { "" };
	/**
	 * 
	 */
	protected Class<?>[] classColonnes = { Object.class };

	/**
	 * Constructeur du modèle
	 */
	public ServiceTableModel() {
		super();
		this.donnees = new ArrayList<T>();
	}

	/**
	 * @see javax.swing.table.TableModel#getColumnCount()
	 */
	@Override
	public int getColumnCount() {
		return this.classColonnes.length;
	}

	/**
	 * @see javax.swing.table.AbstractTableModel#getColumnClass(int)
	 */
	@Override
	public Class<?> getColumnClass(int index) {
		return this.classColonnes[index];
	}

	/**
	 * @see javax.swing.table.AbstractTableModel#getColumnName(int)
	 */
	@Override
	public String getColumnName(int index) {
		return this.nomColonnes[index];
	}

	/**
	 * @see javax.swing.table.TableModel#getRowCount()
	 */
	@Override
	public int getRowCount() {
		return (this.donnees == null ? 0 : this.donnees.size());
	}

	/**
	 * Accesseur pour récupérer les données de type T depuis la ligne d'indice
	 * <code>rowIndex</code>.
	 * 
	 * @param rowIndex
	 *            la ligne qu'on souhaite récupérer.
	 * @return récupére les données de type T depuis la ligne d'indice
	 *         <code>rowIndex</code>.
	 */
	public T getDonneeAt(int rowIndex) {
		T t;
		try {
			t = this.donnees.get(rowIndex);
		} catch (ArrayIndexOutOfBoundsException ex) {
			Main.getJournal().logAvertissement(
					"Tentative d'accès à une donnée inexistante dans "
							+ this.getClass().getCanonicalName()
							+ " avec comme index " + rowIndex);
			t = null;
		}
		return t;
	}

	/**
	 * Mutateur pour les données.
	 * 
	 * @param coll
	 *            la collection de donnees a afficher.
	 */
	public void setDonnees(Collection<T> coll) {
		if (coll == null)
			throw new IllegalArgumentException();
		this.donnees = new ArrayList<T>(coll);
	}

	/**
	 * Effacement des données actuelles.
	 */
	public void clearDonnees() {
		this.donnees = new ArrayList<T>();
	}

	/**
	 * Ajoute un service dans la JTable.
	 * 
	 * @param s
	 *            le service à ajouter.
	 */
	public void ajouterLigne(T s) {
		this.donnees.add(s);
		this.fireTableDataChanged();
	}

	/**
	 * Enleve un service de la JTable.
	 * 
	 * @param s
	 *            le service à enlever.
	 */
	public void enleverLigne(T s) {
		this.donnees.remove(s);
		this.fireTableDataChanged();
	}
}
